package cmd

import (
	"fmt"
	"github.com/spf13/cobra"
	"github.com/spf13/viper"
	"github.com/xiyoufang/cloud-syncer/internal"
	"github.com/xiyoufang/cloud-syncer/internal/config"
	"github.com/xiyoufang/cloud-syncer/internal/env"
	"github.com/xiyoufang/cloud-syncer/internal/http"
	"os"
	"strings"
)

var startCmd = &cobra.Command{
	Use:   "start",
	Short: "启动同步工具",
	Run: func(cmd *cobra.Command, args []string) {
		initConfig()
		err := env.Repository().Migrate()
		if err != nil {
			env.Logger().Error("failed to migrate database: %v", err)
			os.Exit(1)
		}
		go func() { // http 服务
			httpConfig := env.Config().Http // 启动 web server，如果配置为 enabled
			if httpConfig.Enabled {
				bindAddr := fmt.Sprintf("%s:%d", httpConfig.Addr, httpConfig.Port) // 绑定端口并且启动Web服务
				env.Logger().Info("Web server listening on %s", bindAddr)
				err = http.StartWebServer(bindAddr)
				if err != nil {
					env.Logger().Error("failed to start web server: %v", err)
					os.Exit(1)
				}
			} else {
				env.Logger().Warn("Web server is disabled")
			}
		}()
		// 开启文件备份
		scanner := internal.NewFileScanner(env.Config().Sync, env.Repository(), env.Syncer(), env.Logger())
		scanner.Start()
		select {}
	},
}

func init() {
	rootCmd.AddCommand(startCmd)
}

func initConfig() {
	content, err := os.ReadFile(configFileName)
	if err != nil {
		fmt.Printf("读取配置文件%s失败, 执行`%s config`创建或更新配置文件, 错误信息: %v\n", configFileName, commandLineName, err)
		os.Exit(0)
	}
	viper.SetConfigType("yaml")
	if err = viper.ReadConfig(strings.NewReader(os.ExpandEnv(string(content)))); err != nil {
		fmt.Printf("解析配置文件%s失败, 执行`%s config`更新配置文件, 错误信息: %v\n", configFileName, commandLineName, err)
		os.Exit(0)
	}
	c := config.BuildConfig()
	e, err := env.New(c)
	if err != nil {
		fmt.Printf("环境初始化失败, 错误信息: %v\n", err)
		os.Exit(0)
	}
	env.Set(e)
}
